//  Either 函子： 主要做异常处理

// 两者中的任何一个，类似if...else...处理， 主要做异常处理
class Left {
    static of (value){
        return new Left(value)
    }

    constructor (value){
        this._value = value
    }

    map(fn){
        return this
    }
}

class Right {
    static of (value){
        return new Right(value)
    }

    constructor (value){
        this._value = value
    }

    map(fn){
        return Right.of(fn(this._value))
    }
}

// const l = Left.of(12).map(v=>v+3)
// const r = Right.of(12).map(v=>v+3)
// console.log(l, r)

const parseJSON = str => {
    try {
        return Right.of(JSON.parse(str))
    } catch (error) {
        return Left.of({error: error.message})
    }
}

// let r = parseJSON('{name: s}')
let r = parseJSON('{"name": "husky"}').map(v=>v.name.toUpperCase())
console.log(r )